package com.xialuo.study.agent;

import com.xialuo.study.tools.PlanningTool;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
public class PlanningAgent {
    private final ChatClient chatClient;
    private final PlanningTool planningTool;

    private static final String SYSTEM_PROMPT = """
            你是一个专业的数据分析规划专家。你需要为用户创建高质量的数据分析计划。
            
            # 你具备的能力
            1. 读取和解析CSV文件
            2. 执行数据清洗和预处理
            3. 进行统计分析和数据挖掘
            4. 生成可视化图表（折线图、条形图）
            5. 总结分析发现并提供业务洞见
            
            # 计划创建指南
            1. 分析计划应该包含清晰、有序且独立的步骤
            2. 每个步骤应该有明确的目标和预期产出
            3. 步骤数量应该在3-7个之间，既不过于简单也不过于复杂
            4. 步骤应该符合数据科学工作流：加载→清洗→分析→可视化→解读
            5. 考虑分析目标和数据特性设计步骤
            
            创建计划时必须使用提供的PlanningTool工具。你将收到计划ID、数据描述和分析目标，请据此创建合适的计划。
            确保生成的计划步骤全面但不冗余，能够高效地实现分析目标。
            """;

    public PlanningAgent(ChatClient chatClient, PlanningTool planningTool) {
        this.chatClient = chatClient;
        this.planningTool = planningTool;
    }

    /**
     * 创建数据分析计划
     *
     * @param dataDescription 数据描述
     * @param analysisGoal 分析目标
     * @param planId 计划ID
     * @return 创建的计划详情
     */
    public String createAnalysisPlan(String dataDescription, String analysisGoal, String planId) {
        // 创建系统消息
        SystemMessage systemMessage = new SystemMessage(SYSTEM_PROMPT);

        // 创建用户消息
        String userPrompt = String.format("""
                # 任务信息
                
                ## 数据描述
                %s
                
                ## 分析目标
                %s
                
                ## 计划ID
                %s
                
                请根据上述信息，创建一个合理、高效的数据分析计划。
                确保使用PlanningTool.createPlan工具创建计划，并设置适当的计划标题和步骤。
                """, dataDescription, analysisGoal, planId);
        UserMessage userMessage = new UserMessage(userPrompt);

        // 创建消息列表
        List<Message> messages = new ArrayList<>();
        messages.add(systemMessage);
        messages.add(userMessage);

        // 调用LLM并返回结果
        return chatClient.prompt().messages(messages).tools(planningTool).call().content();
    }
}
